///////////////////////////////////////////////////////////////////////////////
// Projekt: O'n'X
// Autor: Lord Darkstorm
// Data utworzenia: 09.08.2013
// Opis: Deklaracja klasy MainClass
///////////////////////////////////////////////////////////////////////////////

#include "mainclass.h"
#include "ui_mainclass.h"

// Konstruktor ///////////////////////////////////////////////////////////////

MainClass::MainClass(QWidget *parent) :
  QWidget(parent, Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint),
  ui(new Ui::MainClass)
{
  ui -> setupUi(this) ;

  // Sprawdzamy, czy plik data.dat istnieje.

  QFile file("data.dat") ;

  // Wstępna inicjalizacja pól od statystyk.

  winCount = 0 ;
  tieCount = 0 ;
  loseCount = 0 ;

  // Jeśli istnieje, aktywujemy pozostałe opcje menu głównego.

  if (file.exists() )
  {
    ui -> createPlayerButton -> setDisabled(true) ;
    ui -> newGameButton -> setEnabled(true) ;
    ui -> changingNickButton -> setEnabled(true) ;
    ui -> statisticsButton -> setEnabled(true) ;

    // I odczytujemy dane z pliku.

    readData() ;
  }

  connect(ui -> exitButton, SIGNAL(clicked() ), qApp, SLOT(quit() ) ) ;
  connect(ui -> aboutGameButton, SIGNAL(clicked() ), this, SLOT(aboutGame() ) ) ;
  connect(ui -> createPlayerButton, SIGNAL(clicked() ), this, SLOT(createPlayer() ) ) ;
  connect(ui -> statisticsButton, SIGNAL(clicked() ), this, SLOT(showStatistics() ) ) ;
  connect(ui -> changingNickButton, SIGNAL(clicked() ), this, SLOT(changeNick() ) ) ;
  connect(ui -> newGameButton, SIGNAL(clicked() ), this, SLOT(newGame() ) ) ;
}

// Destruktor ///////////////////////////////////////////////////////////////////////////////

MainClass::~MainClass()
{
  if (!ui -> createPlayerButton -> isEnabled() )
  {
    // Zapisujemy dane do pliku, jeśli takowy istnieje.

    saveData() ;
  }

  delete ui ;
}

// newGame //////////////////////////////////////////////////////////////////////////////////

void MainClass::newGame()
{
  // 1) Wyświetlamy dialog z trybami gry do wyboru.
  // 2) Uruchamiamy grę z wybranym trybem.
  // 3) Gramy ;)

  NewGameDialog dialog(this) ;

  dialog.exec() ;

  bool whoStarts ;

  if (dialog.canceled) return ;

  // true - rozpoczyna gracz
  // false - rozpoczyna komputer / drugi gracz

  if (dialog.option == NewGameDialog::PlayerVSComputer)
  {
    this -> close() ;

    QMessageBox::information(this, "Uwaga od autora", "No więc, nie chciało mi się zbytnio kombinować nad tym,"
                             " aby komputer był nie do zdarcia.\n\nKomputer gra bardzo słabo, wręcz na \"ślepo\"."
                             " Zresztą ta gra i tak została stworzona specjalnie do trybu online ;P.") ;

    // Losowanie zaczynającego.

    whoStarts = qrand() % 2 ;

    if (whoStarts)
    {
      QMessageBox::information(this, "Losowanie zaczynającego", "Gracz rozpoczyna grę (X).") ;
    }
    else QMessageBox::information(this, "Losowanie zaczynającego", "Komputer rozpoczyna grę (O).") ;

    // Tworzenie planszy i uruchamianie gry.

    GameInterface interface(this, NewGameDialog::PlayerVSComputer, whoStarts) ;
    interface.exec() ;

    // Aktualizacja statystyk.

    if (interface.result() == GameInterface::PlayerWon)
    {
      winCount++ ;
    }
    else if (interface.result() == GameInterface::OpponentWon)
    {
      loseCount++ ;
    }
    else tieCount++ ;

    this -> show() ;
  }
  else if (dialog.option == NewGameDialog::PlayerVSPlayerLocal)
  {
    this -> close() ;

    QMessageBox::information(this, "Uwaga od autora", "W tym trybie gry statystyki nie są liczone.") ;

    whoStarts = qrand() % 2 ;

    if (whoStarts)
    {
      QMessageBox::information(this, "Losowanie zaczynającego", "Gracz pierwszy rozpoczyna grę (X).") ;
    }
    else QMessageBox::information(this, "Losowanie zaczynającego", "Gracz drugi rozpoczyna grę (O).") ;

    GameInterface interface(this, NewGameDialog::PlayerVSPlayerLocal, whoStarts) ;
    interface.exec() ;

    this -> show() ;
  }
  else
  {
    this -> close() ;

    // Odpalamy menu sieciowe i po udanej konfiguracji przystępujemy do gry.

    NetMenuDialog nmd(this) ;

    nmd.exec() ;

    if (nmd.canceled)
    {
      this -> show() ;

      return ;
    }

    GameInterface interface(this, NewGameDialog::PlayerVSPlayerNet, nmd.whoStarts, nmd.socketID) ;
    interface.exec() ;

    if (interface.result() == GameInterface::PlayerWon)
    {
      winCount++ ;
    }
    else if (interface.result() == GameInterface::OpponentWon)
    {
      loseCount++ ;
    }
    else tieCount++ ;

    this -> show() ;
  }
}

// changeNick //////////////////////////////////////////////////////////////////////////////////

void MainClass::changeNick()
{
  // Wywołujemy dialog tworzący gracza,
  // z tym że w tym wypadku będzie on pełnił rolę
  // dialogu do zmiany nicku gracza.

  CreatePlayerDialog dialog(this, "Zmiana nicka") ;

  dialog.exec() ;

  if(dialog.canceled) return ;
  else
  {
    playerName = dialog.name ;

    QMessageBox::information(this, "Suckes", "Nick został pomyślnie zmieniony.") ;
  }
}

// showStatistics /////////////////////////////////////////////////////////////////////////

void MainClass::showStatistics()
{
  // Wyświetla statystyki a następnie pyta usera, czy je wyzerować.

  QMessageBox mbox ;

  mbox.setText("Statystyki dla gracza: " + playerName) ;
  mbox.setInformativeText("Ilość wygranych gier: " + QString::number(winCount)
                          + "\nIlość zremisowanych gier: " + QString::number(tieCount)
                          + "\nIlość przegranych gier: " + QString::number(loseCount)
                          + "\n\nCzy chcesz wyzerować statystyki?") ;

  mbox.setStandardButtons(QMessageBox::Yes | QMessageBox::No) ;
  mbox.setButtonText(QMessageBox::Yes, "Tak") ;
  mbox.setButtonText(QMessageBox::No, "Nie") ;

  // Zerujemy statystyki.

  if (mbox.exec() == QMessageBox::Yes)
  {
    winCount = 0 ;
    tieCount = 0 ;
    loseCount = 0 ;

    QMessageBox::information(this, "Suckes", "Statystyki zostały pomyślnie wyzerowane.") ;
  }
  else return ;
}

// createPlayer //////////////////////////////////////////////////////////////////////////////

void MainClass::createPlayer()
{
  // Tworzymy gracza, a następnie zapisujemy dane do pliku.

  CreatePlayerDialog dialog(this, "Nowy gracz") ;

  dialog.exec() ;

  if (dialog.canceled)
  {
    return ;
  }
  else
  {
    playerName = dialog.name ;

    saveData() ;

    QMessageBox::information(this, "Suckes", "Gracz został pomyślnie utworzony.") ;
  }

  // Aktywujemy pozostałe opcje.

  ui -> changingNickButton -> setEnabled(true) ;
  ui -> newGameButton -> setEnabled(true) ;
  ui -> statisticsButton -> setEnabled(true) ;
  ui -> createPlayerButton -> setDisabled(true) ;
}

// aboutGame ////////////////////////////////////////////////////////////////////////////////

void MainClass::aboutGame()
{
  // Wyświetlamy okienko z opisem gry.

  QMessageBox about ;

  about.setIconPixmap(QPixmap(":/new/prefix1/logo.png") ) ;
  about.setWindowTitle("O grze") ;
  about.setText("Projekt: O'n'X\nAutor: Lord Darkstorm") ;
  about.setInformativeText("No to tego... Ta oto gierka została stworzona tylko i wyłącznie z nudów. "
                           "Zawsze warto wzbogacić zasób rozrywek na zajęciach w budzie.") ;
  about.setStandardButtons(QMessageBox::Ok) ;

  about.exec() ;
}

// saveData /////////////////////////////////////////////////////////////////////////////////

void MainClass::saveData()
{
  // Zapisujemy dane do pliku.

  QFile file("data.dat") ;

  file.open(QFile::WriteOnly | QFile::Text) ;

  QTextStream out(&file) ;

  out << playerName << '`' ;
  out << winCount << '`' ;
  out << tieCount << '`' ;
  out << loseCount ;

  file.close() ;
}

// readData /////////////////////////////////////////////////////////////////////////////////

void MainClass::readData()
{
  // Odczytujemy dane z pliku.

  QFile file("data.dat") ;
  QStringList SL ;
  QString tmp ;

  file.open(QFile::ReadOnly | QFile::Text) ;

  tmp = QString(file.readAll() ) ;

  SL = tmp.split('`') ;

  playerName = SL[0] ;
  winCount = SL[1].toInt() ;
  tieCount = SL[2].toInt() ;
  loseCount = SL[3].toInt() ;

  file.close() ;
}
